package 校招笔试.滴滴笔试;

import java.util.Scanner;

/**
 * @author aodre , QQ : 480029069
 * @date 2023/9/17 8:45
 */
public class Main {



    /*
        你负责在一条笔直的道路上安装一些照明灯。但是道路上并不是任意位置都适合安装照明灯，
        具体地，假设将道路看作一条起点坐标为0，终点坐标为M的线段，那么只有在x1,x2,...,xn这n个坐标可以安装照明灯，且每个坐标上最多只能安装一个照明灯。现在你要在道路上安装k个照明灯，
        为了使照明灯能够尽量覆盖道路，你需要使距离最近的两个照明灯尽量远。请问这个最近距离最大可以是多少?

     */


    /*
      知道这道题， 错在哪了没
      求 min 的 max 值， 其实 是在 二分 枚举 谁？  min 吧， min才是答案！
      你 二分的都是 min ,这一点是非常关键, 在check 函数, 这个是非常关键的判断的依据
      痛的醒悟
     */
    public static void main(String[] args) {
        new Main().solve1();
    }

    public void solve1() {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(), k = sc.nextInt();
        int nums[] = new int[n];
        for (int i = 0; i < n; i++) {
            nums[i] = sc.nextInt();
        }
        int l = 0, r = nums[n - 1] - nums[0];
        while (l < r) {
            int mid = l + r + 1 >> 1;
            if (check(nums, mid) < k) {
                r = mid - 1;
            } else {
                l = mid;
            }
        }
        System.out.println(l);

    }
    /*
     其实 果然是这个 check 函数比较 难理解
     */
    private int check(int[] nums, int mid) {
        int cnt = 1;
        for (int i = 1; i < nums.length;) {
            int binary = binary(nums, nums[i - 1] + mid);
            if(binary == -1){
                break;
            }
            cnt++;
            i = binary + 1;
        }

        return cnt;
    }

    // 找到 >= val 的最左边的位置, 如果找不到返回 -1
    public int binary(int nums[], int val) {
        int l = 0, r = nums.length - 1;
        while (l < r) {
            int mid = l + r >> 1;
            if (nums[mid] < val) {
                l = mid + 1;
            } else {
                r = mid;
            }
        }
        return l == nums.length - 1 && nums[l] < val ? -1 : l;
    }


}
